#include<bits/stdc++.h>
#include"graph.h"
using namespace std;

typedef long long ll;
typedef unsigned long long ull;

const int NN=209;

vector<int> son[NN],sid[NN];
vector<int> ban[NN];
int fa[NN],fid[NN];
int vis[NN];
int ncnt=0;

int ma[NN][NN];
void Add_edge(int u,int v){ma[u][v]=ma[v][u]=1;}

void dfs(int u)
{
	int deg=NumberOfRoads();
	ban[u].resize(deg+1);
	if(fid[u]) ban[u][fid[u]]=1;
	for(int i=1;i<=deg;i++)
	if(i!=fid[u])
	{
		Move(i,2);
		if(Color()==1)
		{
			int v=(++ncnt);
			son[u].push_back(v);
			sid[u].push_back(i);
			fa[v]=u;
			fid[v]=LastRoad();
			Add_edge(u,v);
			dfs(v);
			Move(fid[v],3);
			ban[u][i]=1;
		}
		else
		{
			if(Color()==3) ban[u][i]=1;
			Move(LastRoad(),Color());
		}
	}
}
void dfs3(int u,int st)
{
	if(Color()==1) Add_edge(u,st);
	if(fa[u])
	{
		Move(fid[u],2);
		int id_=LastRoad();
		dfs3(fa[u],st);
		Move(id_,2);
	}
}
void dfs2(int u)
{
	int deg=NumberOfRoads();
	for(int i=1;i<=deg;i++)
	if(!ban[u][i])
	{
		Move(i,2);
		Move(LastRoad(),1);
	}
	dfs3(u,u);
	for(int i=0;i<son[u].size();i++)
	{
		Move(sid[u][i],2);
		dfs2(son[u][i]);
		Move(fid[son[u][i]],2);
	}
}
int dis[NN][NN];
queue<int> q;
void bfs(int st)
{
	while(!q.empty()) q.pop();
	q.push(st);
	for(int i=1;i<=ncnt;i++) dis[st][i]=-1;
	dis[st][st]=0;
	while(!q.empty())
	{
		int u=q.front();q.pop();
		for(int i=1;i<=ncnt;i++)
		if(ma[u][i]&&dis[st][i]==-1)
		{
			dis[st][i]=dis[st][u]+1;
			q.push(i);
		}
	}
}
int ans[NN];
void Inspect(int R)
{
	ncnt++;
	dfs(1);
	dfs2(1);
	for(int i=1;i<=ncnt;i++) bfs(i);
	for(int i=1;i<=ncnt;i++)
	for(int j=i+1;j<=ncnt;j++) ans[dis[i][j]]++;
	for(int i=1;i<=R;i++) Answer(i,ans[i]);
}
